VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
  Persistable = 0  'NotPersistable
  DataBindingBehavior = 0  'vbNone
  DataSourceBehavior  = 0  'vbNone
  MTSTransactionMode  = 0  'NotAnMTSObject
END
Attribute VB_Name = "DoubleWord"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit

'Darwinbots uses Two's Compliment for bit representation.
'Note that the first bit is that bit which is written leftmost in
'writing.  ie: 1 is first bit 00000000000000000000000000000001

'Note that bitwise operations are mod 2^(n-1) where n is the number of bits
'1 bit is used for positive/negative.  Also, you can go one large in the
'negative direction than you can in the positive

Public bit(31) As Boolean '32 bit locations

Private Function NumberToBit(ByVal value As Long) As DoubleWord
  Dim negative As Boolean
  
  If value < 0 Then
    negative = True
    value = -value
  End If
  
  For counter = 30 To 0
    If value / Int(2 ^ counter) = 1 Then
      'bit is true
      NumberToBit.bit(counter) = True
      value = value - 2 ^ counter
    Else
      NumberToBit.bit(counter) = False
    End If
  Next counter
  
  If negative Then
    'invert bits then add 1
    InvertBits NumberToBit
    IncBits NumberToBit
  End If
End Function

Private Function BitToNumber(ByRef bits As DoubleWord) As Long
  Dim counter As Long
  Dim negative As Boolean
  
  BitToNumber = 0
  negative = False
  
  If bits.bit(31) = True Then
    'negative value, so subtract 1 then invert bits
    'to get magnitude
    negative = True
    DecBits bits
    InvertBits bits
  End If
  
  For counter = 0 To 30 '31st bit is always zero at this point
    BitToNumber = BitToNumber + (2 ^ counter) * (bits.bit(counter) * True)
  Next counter
  
  If negative Then BitToNumber = -BitToNumber
End Function

Private Sub InvertBits(ByRef bits As DoubleWord) 'compliment
  Dim counter As Long
  
  For counter = 0 To 31
    bits.bit(counter) = Not bits.bit(counter)
  Next counter
End Sub

Private Sub IncBits(ByRef bits As DoubleWord) 'bitinc
  Dim counter As Long
  
  For counter = 0 To 31
    If bits.bit(counter) = False Then
      bits.bit(counter) = True
      Exit Sub 'we're done
    Else
      'we have to carry bits
      bits.bit(counter) = False
    End If
  Next counter
End Sub

Private Sub DecBits(ByRef bits As DoubleWord) 'bitdec
  Dim counter As Long
  
  For counter = 0 To 31
    If bits.bit(counter) = True Then
      bits.bit(counter) = False
      Exit Sub 'we're done
    Else
      'we have to borrow bits
      bits.bit(counter) = True
    End If
  Next counter
End Sub

Private Sub BitShiftLeft(ByRef bits As DoubleWord) 'AKA mult by 2 (<<)
  Dim counter As Long
  
  For counter = 31 To 1
    bits.bit(counter) = bits.bit(counter - 1)
  Next counter
  
  bits.bit(0) = False
End Sub

Private Sub BitShiftRight(ByRef bits As DoubleWord) 'AKA divide by 2 (>>)
  Dim counter As Long
  
  For counter = 0 To 30
    bits.bit(counter) = bits.bit(counter + 1)
  Next counter
  
  bits.bit(31) = False
End Sub

Private Function BitAND(ByRef bitsA As DoubleWord, ByRef bitsB As DoubleWord) As DoubleWord
  Dim counter As Long
  
  For counter = 0 To 31
    BitAND.bit(counter) = bitsA.bit(counter) And bitsB.bit(counter)
  Next counter
End Function

Private Function BitOR(ByRef bitsA As DoubleWord, bitsB As DoubleWord) As DoubleWord
  Dim counter As Long
  
  For counter = 0 To 31
    BitOR.bit(counter) = bitsA.bit(counter) Or bitsB.bit(counter)
  Next counter
End Function

Public Sub XOR(ByRef bitsA As DoubleWord)
  Dim counter As Long
  
  For counter = 0 To 31
     = bitsA.bit(counter) Xor bitsB.bit(counter)
  Next counter
End Function

'bit mirroring
'Private Sub BitFlip(ByRef bits As DoubleWord)
'  Dim counter As Long
'
'  For coutner = 0 To 15
'    If bits.bit(counter) <> bits.bit(31 - counter) Then 'swap bits
'      bits
'    End If
'  Next counter
'End Sub
